package waveFileSave

import (
	"context"
	"devops-super/internal/consts"
	"devops-super/utility/util/appUtil"
	"fmt"
	"github.com/gogf/gf/v2/frame/g"
	"os"
	"path/filepath"
)

// GetSaveFlag ==0 本地 1 oss
func GetSaveFlag(ctx context.Context) int {
	v, _ := g.Cfg().Get(ctx, "upload.default")
	if v.Int() == 1 {
		return consts.StoreFlagOss
	} else {
		return consts.StoreFlagLocal
	}
}

func GetWaveSavePath(label string, filename string) (path string, err error) {
	separator := "/"
	// 创建或获取数据库连接
	docDir, _ := appUtil.GetRootDir()
	path = docDir + separator + consts.AppDataDir + separator + "wave" + separator + label + separator + filename
	return path, nil
}

// WriteToFile 写入数据到指定文件，支持追加和覆盖
// filePath: 文件路径
// data: 要写入的数据
// appendMode: 是否为追加模式，true表示追加，false表示覆盖
func WriteToFile(filePath string, data []byte, appendMode bool) error {
	// 获取文件所在的目录
	dir := filepath.Dir(filePath)

	// 如果目录不存在，则创建目录
	err := os.MkdirAll(dir, os.ModePerm)
	if err != nil {
		return fmt.Errorf("无法创建目录: %v", err)
	}

	// 打开文件，支持追加或覆盖模式
	var file *os.File
	if appendMode {
		// 追加模式
		file, err = os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	} else {
		// 覆盖模式
		file, err = os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
	}

	if err != nil {
		return fmt.Errorf("无法打开文件: %v", err)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {

		}
	}(file)

	// 写入数据
	_, err = file.Write(data)
	if err != nil {
		return fmt.Errorf("写入文件失败: %v", err)
	}

	return nil
}

func DeleteFile(filePath string) (err error) {
	if !FileExists(filePath) {
		return nil
	}
	// 删除文件 可能文件不存在或者没有权限
	err = os.Remove(filePath)
	return nil
}

func FileExists(filePath string) bool {
	file, err := os.Open(filePath)
	defer func() {
		err := file.Close()
		if err != nil {
			return
		}
	}()
	// 文件打开失败且错误是因为文件不存在
	return err == nil || os.IsNotExist(err)
}

// ReadFileData 读取指定文件路径的全部数据并返回[]byte
func ReadFileData(filePath string) ([]byte, error) {
	// 使用 os.ReadFile 读取文件的全部内容
	data, err := os.ReadFile(filePath)
	if err != nil {
		return nil, fmt.Errorf("读取文件失败: %v", err)
	}
	return data, nil
}
